home *** CD-ROM | disk | FTP | other *** search
/ Your Choice 3 / Your Choice Software Collection 3.iso / os2 / lbasic06 / ttt.bas < prev    next >
BASIC Source File  |  1994-05-21  |  11KB  |  413 lines

  1.  
  2.     'Tic Tac Toe
  3.     'Requires Liberty BASIC v1.0 for Windows or better
  4.     'or Liberty BASIC v0.6 for OS/2 or better
  5.     'Copyright 1993, Shoptalk Systems
  6.     'All Rights Reserved
  7.  
  8.     ' set up the board
  9.     dim board$(9)
  10.     dim razz$(9)
  11.  
  12.     nomainwin
  13.  
  14.     loadbmp "title", "titlettt.bmp"
  15.     loadbmp "square", "squarttt.bmp"
  16.  
  17.     WindowWidth = 314
  18.     WindowHeight = 400
  19.     button #brd, " T ", [1], UL, 10, 60
  20.     button #brd, " I ", [2], UL, 110, 60
  21.     button #brd, " C ", [3], UL, 210, 60
  22.     button #brd, " T ", [4], UL, 10, 160
  23.     button #brd, " A ", [5], UL, 110, 160
  24.     button #brd, " C ", [6], UL, 210, 160
  25.     button #brd, " T ", [7], UL, 10, 260
  26.     button #brd, " O ", [8], UL, 110, 260
  27.     button #brd, " E ", [9], UL, 210, 260
  28.     button #brd, "Pass Move", [skipMove], UL, 210, 10
  29.     textbox #brd.comment, 10, 27, 170, 25
  30.     menu #brd, "&Help", "&Instructions", [instruct], "&About Tic Tac Toe", [about]
  31.     open "Tic Tac Toe Playing Board" for graphics_nsb as #brd
  32.     print #brd, "trapclose [quit]";
  33.     print #brd, "size 3 ; down";
  34.     gosub [drawBoard]
  35.     yourName$ = "Human"
  36.     prompt "What is your name?"; yourName$
  37.  
  38.     razz$(0) = "Boooh! Hisss!"
  39.     razz$(1) = "Oh! I'm Scared!"
  40.     razz$(2) = "No Dur!"
  41.     razz$(3) = "Why that move?"
  42.     razz$(4) = "Lost Cause."
  43.     razz$(5) = "No Hope."
  44.     razz$(6) = "Change Careers."
  45.     razz$(7) = "Major Bummer!"
  46.     razz$(8) = "Boring."
  47.     razz$(9) = "I'm insulted."
  48.  
  49.  
  50. [start]    'start game (or restart)
  51.  
  52.     for x = 1 to 9 : board$(x) = " " : next x
  53.     gosub [modelBoard]
  54.     turn = 0
  55.     true = 1
  56.     false = 0
  57.     pass = false
  58.     comment$ = "Your Turn, " + yourName$
  59.     lastComment$ = ""
  60.     moveCounter = 0
  61.     gosub [comment]
  62.  
  63. [playLoop]
  64.  
  65.  
  66.     input position$
  67.  
  68.   goto [playLoop]
  69.  
  70.  
  71. [move]
  72.  
  73.     ' X moves
  74.     if board$(val(position$)) <> " " then notice "Illegal Move!" : goto [playLoop]
  75.     moveCounter = moveCounter + 1
  76.     pass = false
  77.     board$(val(position$)) = "X"
  78.     gosub [drawX]
  79.     gosub [modelBoard]
  80.     gosub [checkForWinOrDraw]
  81.     goto [oMoves]
  82.  
  83. [skipMove]
  84.  
  85.     pass = true
  86.  
  87. [oMoves]
  88.  
  89.     ' O moves
  90.     gosub [computeMove]
  91.     board$(val(position$)) = "O"
  92.     gosub [drawO]
  93.     gosub [modelBoard]
  94.     gosub [checkForWinOrDraw]
  95.  
  96.   goto [playLoop]
  97.  
  98.  
  99. [1]
  100.     position$ = "1" : goto [move]
  101. [2]
  102.     position$ = "2" : goto [move]
  103. [3]
  104.     position$ = "3" : goto [move]
  105. [4]
  106.     position$ = "4" : goto [move]
  107. [5]
  108.     position$ = "5" : goto [move]
  109. [6]
  110.     position$ = "6" : goto [move]
  111. [7]
  112.     position$ = "7" : goto [move]
  113. [8]
  114.     position$ = "8" : goto [move]
  115. [9]
  116.     position$ = "9" : goto [move]
  117.  
  118. [end]
  119.  
  120.     end
  121.  
  122. [drawBoard]
  123.  
  124.     print #brd, "fill lightgray";
  125.     print #brd, "drawbmp title 7 2";
  126.     for x = 4 to 204 step 100
  127.     for y = 54 to 254 step 100
  128.         print #brd, "drawbmp square "; x; " "; y ;
  129.     next y
  130.     next x
  131.     print #brd, "flush";
  132.  
  133.  
  134. [comment]
  135.  
  136.     if comment$ = "" or comment$ = lastComment$ then return
  137.     print #brd.comment, comment$
  138.  
  139.   return
  140.  
  141.  
  142.  
  143. [drawX]
  144.  
  145.     gosub [xlatePosition]
  146.     print #brd, "size 6";
  147.     print #brd, "color darkred";
  148.     print #brd, "line "; squareX-11; " "; squareY-16; " "; squareX+19; " "; squareY+24
  149.     print #brd, "line "; squareX+19; " "; squareY-16; " "; squareX-11; " "; squareY+24
  150.     print #brd, "color red";
  151.     print #brd, "line "; squareX-15; " "; squareY-20; " "; squareX+15; " "; squareY+20
  152.     print #brd, "line "; squareX+15; " "; squareY-20; " "; squareX-15; " "; squareY+20
  153.     print #brd, "flush";
  154.  
  155.   return
  156.  
  157.  
  158. [drawO]
  159.  
  160.     gosub [xlatePosition]
  161.     print #brd, "size 7";
  162.     print #brd, "color darkblue";
  163.     print #brd, "place "; squareX+5; " "; squareY+5
  164.     print #brd, "circle 20";
  165.     print #brd, "color blue";
  166.     print #brd, "place "; squareX; " "; squareY
  167.     print #brd, "circle 20";
  168.     print #brd, "flush";
  169.  
  170.   return
  171.  
  172.  
  173. [xlatePosition]
  174.  
  175.     position = val(position$)
  176.  
  177.     squareX = 55
  178.     if instr("258", position$) > 0 then squareX = 155
  179.     if instr("369", position$) > 0 then squareX = 255
  180.  
  181.     squareY = int((val(position$)+2)/3)*100+5
  182.  
  183.   return
  184.  
  185.  
  186. [modelBoard]
  187.  
  188.     row1$ = board$(1)+board$(2)+board$(3)
  189.     row2$ = board$(4)+board$(5)+board$(6)
  190.     row3$ = board$(7)+board$(8)+board$(9)
  191.  
  192.     col1$ = board$(1)+board$(4)+board$(7)
  193.     col2$ = board$(2)+board$(5)+board$(8)
  194.     col3$ = board$(3)+board$(6)+board$(9)
  195.  
  196.     diag1$ = board$(1)+board$(5)+board$(9)
  197.     diag2$ = board$(7)+board$(5)+board$(3)
  198.  
  199.   return
  200.  
  201.  
  202.  
  203. [computeMove]
  204.  
  205.  
  206.     ' create some sort of intimidating comment
  207.  
  208.     newComment$ = razz$(int(rnd(1)*10))
  209.     if comment$ = newComment$ then [computeMove] ' try again
  210.     comment$ = newComment$
  211.     if pass = true then comment$ = "You pass."
  212.     gosub [comment]
  213.  
  214.  
  215.     'check for instant win!
  216.  
  217. [instantWin]
  218.  
  219.     if moveCounter < 3 then [defend]
  220.  
  221.     if row1$ = "OO " then position$ = "3" : return
  222.     if row1$ = " OO" then position$ = "1" : return
  223.     if row1$ = "O O" then position$ = "2" : return
  224.     if row2$ = "OO " then position$ = "6" : return
  225.     if row2$ = " OO" then position$ = "4" : return
  226.     if row2$ = "O O" then position$ = "5" : return
  227.     if row3$ = "OO " then position$ = "9" : return
  228.     if row3$ = " OO" then position$ = "7" : return
  229.     if row3$ = "O O" then position$ = "8" : return
  230.  
  231.     if col1$ = "OO " then position$ = "7" : return
  232.     if col1$ = " OO" then position$ = "1" : return
  233.     if col1$ = "O O" then position$ = "4" : return
  234.     if col2$ = "OO " then position$ = "8" : return
  235.     if col2$ = " OO" then position$ = "2" : return
  236.     if col2$ = "O O" then position$ = "5" : return
  237.     if col3$ = "OO " then position$ = "9" : return
  238.     if col3$ = " OO" then position$ = "3" : return
  239.     if col3$ = "O O" then position$ = "6" : return
  240.  
  241.     if diag1$ = "OO " then position$ = "9" : return
  242.     if diag1$ = " OO" then position$ = "1" : return
  243.     if diag1$ = "O O" then position$ = "5" : return
  244.     if diag2$ = "OO " then position$ = "3" : return
  245.     if diag2$ = " OO" then position$ = "7" : return
  246.     if diag2$ = "O O" then position$ = "5" : return
  247.  
  248. [defend]
  249.  
  250.     'make the purely defensive moves
  251.  
  252.     if moveCounter = 1 then [attack]
  253.  
  254.     if row1$ = "XX " then position$ = "3" : return
  255.     if row1$ = " XX" then position$ = "1" : return
  256.     if row1$ = "X X" then position$ = "2" : return
  257.     if row2$ = "XX " then position$ = "6" : return
  258.     if row2$ = " XX" then position$ = "4" : return
  259.     if row2$ = "X X" then position$ = "5" : return
  260.     if row3$ = "XX " then position$ = "9" : return
  261.     if row3$ = " XX" then position$ = "7" : return
  262.     if row3$ = "X X" then position$ = "8" : return
  263.  
  264.     if col1$ = "XX " then position$ = "7" : return
  265.     if col1$ = " XX" then position$ = "1" : return
  266.     if col1$ = "X X" then position$ = "4" : return
  267.     if col2$ = "XX " then position$ = "8" : return
  268.     if col2$ = " XX" then position$ = "2" : return
  269.     if col2$ = "X X" then position$ = "5" : return
  270.     if col3$ = "XX " then position$ = "9" : return
  271.     if col3$ = " XX" then position$ = "3" : return
  272.     if col3$ = "X X" then position$ = "6" : return
  273.  
  274.     if diag1$ = "XX " then position$ = "9" : return
  275.     if diag1$ = " XX" then position$ = "1" : return
  276.     if diag1$ = "X X" then position$ = "5" : return
  277.     if diag2$ = "XX " then position$ = "3" : return
  278.     if diag2$ = " XX" then position$ = "7" : return
  279.     if diag2$ = "X X" then position$ = "5" : return
  280.  
  281.  
  282. [attack]
  283.  
  284.     ' now make the offensive moves
  285.  
  286.     moves$ = ""
  287.  
  288.     if instr(diag1$,"X") > 0 then [d2]
  289.     if board$(1) = " " then moves$ = moves$ + "1"
  290.     if board$(5) = " " then moves$ = moves$ + "5"
  291.     if board$(9) = " " then moves$ = moves$ + "9"
  292.     i = int(rnd(1)*len(moves$))+1
  293.     position$ = mid$(moves$, i, 1)
  294.     return
  295.  
  296.  
  297.  
  298. [d2]
  299.  
  300.     if instr(diag2$,"X") > 0 then [moreMoves]
  301.     if board$(7) = " " then moves$ = moves$ + "7"
  302.     if board$(5) = " " then moves$ = moves$ + "5"
  303.     if board$(3) = " " then moves$ = moves$ + "3"
  304.     i = int(rnd(1)*len(moves$))+1
  305.     position$ = mid$(moves$, i, 1)
  306.     return
  307.  
  308.  
  309. [moreMoves]
  310.  
  311.     ' now make random moves
  312.  
  313.     all$ = row1$ + row2$ + row3$
  314.     blanks$ = ""
  315.     for i = 1 to 9
  316.         if mid$(all$, i, 1) = " " then blanks$ = blanks$ + chr$(48+i)
  317.     next i
  318.     if blanks$ = "" then position$ = "" : return
  319.     i = int(rnd(1)*len(blank$))+1
  320.     position$ = mid$(blanks$, i, 1)
  321.     return
  322.  
  323. [error]
  324.  
  325.     notice "Error, no move computed"
  326.     stop
  327.  
  328.  
  329.     'check to see if the game has been won or drawn
  330.  
  331. [checkForWinOrDraw]
  332.  
  333.     ' check for win
  334.     i$ = ","
  335.     letter$ = "XXX"
  336.     for i = 1 to 2
  337.         if instr(row1$+i$+row2$+i$+row3$, letter$) > 0 then [win]
  338.         if instr(col1$+i$+col2$+i$+col3$, letter$) > 0 then [win]
  339.         if instr(diag1$+i$+diag2$, letter$) > 0 then [win]
  340.         letter$ = "OOO"
  341.     next i
  342.  
  343.     'check to see if the board is full
  344.     if instr(row1$+row2$+row3$, " ") > 0 then return
  345.  
  346.     'the game is a draw
  347.  
  348.     confirm "Draw!  Play again?"; play$
  349.     if play$ = "yes" then print #brd, "cls "; : gosub [drawBoard] : goto [start]
  350.     goto [quit]
  351.  
  352.  
  353. [win]
  354.  
  355.     if letter$ = "OOO" then notice "I WIN!  HA HA HA!"
  356.     if letter$ = "XXX" then notice "You win "; yourName$; "!!!, Bummer!"
  357.     confirm "Play again?"; play$
  358.     if letter$ = "OOO" and play$ = "no" then notice "Sore loser!"
  359.     if play$ = "yes" then print #brd, "cls "; : gosub [drawBoard] : goto [start]
  360.  
  361.  
  362. [quit]
  363.  
  364.     if instructIsOpen = 1 then close #instruct
  365.     close #brd
  366.  
  367.     end
  368.  
  369.  
  370. [instruct]
  371.  
  372.     WindowHeight = 250
  373.     UpperLeftX = 300
  374.     UpperLeftY = 50
  375.  
  376.     button #instruct, "OK", [closeInstruct], LR, 5, 5
  377.     open "Tic Tac Toe Instructions" for graphics_nsb as #instruct
  378.  
  379.     print #instruct, "trapclose [closeInstruct]";
  380.  
  381.     text$ = "\ "
  382.     text$ = text$ + "\Tic Tac Toe"
  383.     text$ = text$ + "\Copyright 1993, Shoptalk Systems"
  384.     text$ = text$ + "\ "
  385.     text$ = text$ + "\Instructions:"
  386.     text$ = text$ + "\ "
  387.     text$ = text$ + "\  In this game, you play against the"
  388.     text$ = text$ + "\  computer.  You are X, and the computer"
  389.     text$ = text$ + "\  is O.  The one to get 3 in a row wins."
  390.     text$ = text$ + "\  If no one gets three in a row, then"
  391.     text$ = text$ + "\  it is a draw."
  392.  
  393.     print #instruct, text$
  394.     print #instruct, "flush";
  395.  
  396.     instructIsOpen = 1
  397.  
  398.     goto [playLoop]
  399.  
  400. [closeInstruct]
  401.  
  402.     close #instruct
  403.     instructIsOpen = 0
  404.  
  405.     goto [playLoop]
  406.  
  407.  
  408. [about]
  409.  
  410.     notice "About Tic Tac Toe"+chr$(13)+"Tic Tac Toe, A Liberty BASIC program"
  411.  
  412.     goto [playLoop]
  413.